home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 11 / QRZ Ham Radio Callsign Database - Volume 11.iso / files / packet / ax25ip.shr / ax25.c < prev    next >
C/C++ Source or Header  |  1998-02-02  |  4KB  |  175 lines

  1. #include <sys/types.h>
  2. #include <sys/param.h>
  3. #include <sys/socket.h>
  4. #include <sys/stropts.h>
  5. #include <sys/termios.h>
  6. #include <sys/ttold.h>
  7. #include <sys/sockio.h>
  8. #include <sys/file.h>
  9. #include <sys/if_ax.h>
  10. #include <netinet/in.h>
  11. #include <net/if.h>
  12. #include <netinet/if_ether.h>
  13. #include <stdio.h>
  14.  
  15. u_char ax25broadcastaddr[7] = {
  16.     'Q'<<1, 'S'<<1, 'T'<<1, ' '<<1, ' '<<1, ' '<<1, '0'<<1
  17. };
  18. static struct ether_addr etherbroadcastaddr = {
  19.     0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  20. };
  21.  
  22. int
  23. main(argc, argv)
  24. char **argv;
  25. {
  26.     struct termios tios;
  27.     u_char ax25[7];
  28.     struct ether_addr eth;
  29.     char cmd[128], name[64];
  30.     u_char *cp, c;
  31.     int verbose = 0;
  32.     int unit = 777;
  33.     int fd, i;
  34.  
  35.     if(argc<4) {
  36.         printf("usage: %s [-v] inet-addr ham-call-sign tty\n", *argv);
  37.         exit(0);
  38.     }
  39.  
  40.     if( !strcmp(argv[1], "-v") ) {
  41.         verbose = 1;
  42.         argv++;
  43.     }
  44.  
  45.     fd = open(argv[3], O_RDWR);
  46.     if(fd == -1) {
  47.         perror("open");
  48.         exit(1);
  49.     }
  50.  
  51.     while(1) {
  52.         if(verbose)
  53.             if(ioctl(fd, I_LOOK, name) != -1)
  54.                 printf("popping module: %s\n", name);
  55.         if(ioctl(fd, I_POP, 0) == -1)
  56.             break;
  57.     }
  58.  
  59.     if( ioctl(fd, TCGETS, &tios) <0) {
  60.         perror("ioctl TCGETS");
  61.         exit(1);
  62.     }
  63.  
  64.     tios.c_cflag  = CRTSCTS | B9600;
  65.     tios.c_cflag |= CS8|CREAD|HUPCL;
  66.     tios.c_iflag = IGNBRK;
  67.     if( ioctl(fd, TCSETS, &tios) <0) {
  68.         perror("ioctl TCSETS");
  69.         exit(1);
  70.     }
  71.  
  72.     if(verbose)
  73.         printf("pushing module: ax25\n");
  74.     if( ioctl(fd, I_PUSH, "ax25") == -1) {
  75.         perror("ioctl I_PUSH");
  76.         exit(1);
  77.     }
  78.  
  79.     if( ioctl(fd, AXIOGUNIT, &unit) != -1) {
  80.         if(verbose)
  81.             printf("network device: ax%d\n", unit);
  82.     } else {
  83.         perror("ioctl AXIOGUNIT");
  84.         exit(1);
  85.     }
  86.  
  87.     /*
  88.      * convert the HAM call sign to an ax25_addr
  89.      */
  90.     i = 0;
  91.     bzero((caddr_t)ax25, sizeof(ax25));
  92.     for(cp=(u_char *)argv[2]; *cp && (i<6); cp++) {
  93.         if(*cp=='-') {
  94.             cp++;
  95.             break;
  96.         }
  97.         c = islower(*cp) ? toupper(*cp) : *cp;
  98.         ax25[i++] = (u_char)(c << 1);
  99.     }
  100.     while(i<6)
  101.         ax25[i++] = (u_char)(' ' << 1);
  102.     while(*cp=='-')
  103.         cp++;
  104.     if(*cp)
  105.         ax25[6] = (u_char)(*cp << 1);
  106.  
  107.     ax_ax2ether(ax25, ð);
  108.     if( ioctl(fd, AXIOSHADDR, ð) == -1) {
  109.         perror("ioctl AXIOSHADDR");
  110.         exit(1);
  111.     }
  112.  
  113.     sprintf(cmd, "ifconfig ax%d %s netmask + broadcast + up",
  114.         unit, argv[1]);
  115.     if(verbose)
  116.         printf("execute: %s\n", cmd);
  117.     system(cmd);
  118.  
  119.     while(sigpause(0)!=-1)
  120.         ;
  121.     return 0;
  122. }
  123.  
  124.  
  125. /*
  126.  * convert an ax25 address to an ether_addr
  127.  */
  128. ax_ax2ether(axhp, ethp)
  129. u_char *axhp;
  130. struct ether_addr *ethp;
  131. {
  132.     u_char c;
  133.     int i;
  134.  
  135.     printf("addresses: ax25 ");
  136.     for(i=0; i<6; i++)
  137.         printf("%02x.", axhp[i]);
  138.     printf("%02x '", axhp[6]);
  139.  
  140.     for(i=0; i<(7-1); i++)
  141.         printf("%c", axhp[i]>>1);
  142.     printf("-%c' = ether ", axhp[6]>>1);
  143.  
  144.     if( !bcmp((caddr_t)axhp, (caddr_t)ax25broadcastaddr,
  145.         sizeof(ax25broadcastaddr)) ) {
  146.         bcopy((caddr_t)ðerbroadcastaddr, (caddr_t)ethp,
  147.             sizeof(struct ether_addr));
  148.         goto done;
  149.     }
  150.  
  151.     ethp->ether_addr_octet[0] = 0x99;
  152.     c =  ((((axhp[0]>>1) - ' ') << 2) & 0xfc);
  153.     c |= ((((axhp[1]>>1) - ' ') >> 4) & 0x03);
  154.     ethp->ether_addr_octet[1] = c;
  155.     c =  ((((axhp[1]>>1) - ' ') << 4) & 0xf0);
  156.     c |= ((((axhp[2]>>1) - ' ') >> 2) & 0x0f);
  157.     ethp->ether_addr_octet[2] = c;
  158.     c =  ((((axhp[2]>>1) - ' ') << 6) & 0xc0);
  159.     c |= ((((axhp[3]>>1) - ' ')     ) & 0x3f);
  160.     ethp->ether_addr_octet[3] = c;
  161.     c =  ((((axhp[4]>>1) - ' ') << 2) & 0xfc);
  162.     c |= ((((axhp[5]>>1) - ' ') >> 4) & 0x03);
  163.     ethp->ether_addr_octet[4] = c;
  164.     c =  ((((axhp[5]>>1) - ' ') << 4) & 0xf0);
  165.     c |= ((((axhp[6]>>1) - '0')     ) & 0x0f);
  166.     ethp->ether_addr_octet[5] = c;
  167.  
  168. done:
  169.     for(i=0; i<sizeof(struct ether_addr)-1; i++)
  170.         printf("%02x:", ethp->ether_addr_octet[i]);
  171.     printf("%02x\n", ethp->ether_addr_octet[5]);
  172.     return 0;
  173. }
  174.  
  175.